package timer

import (
	"errors"
	"github.com/Sir-yuChen/funAnalyse/global"
	"github.com/Sir-yuChen/funAnalyse/model"
	"github.com/Sir-yuChen/funAnalyse/service/timer/handles"
	"github.com/Sir-yuChen/funAnalyse/utils/timer"
	"github.com/robfig/cron/v3"
	"go.uber.org/zap"
	"time"
)

/*
	定时任务的派遣指定执行者
*/

type TimerDispatch struct {
}

var timerStructMap = make(map[string]func(task model.StockTImer, params map[string]interface{}, option ...cron.Option) error, 100)

func init() {
	dispatch := NewTimerDispatch()
	//默认配置的系统初始化任务 该map仅用于添加 无入参无返回值的参数
	m := map[string]func(){
		"TEST_TIMER": dispatch.TestTimer,
	}
	for k, v := range m {
		//定时任务添加
		value, err := timer.SetTimerValue(k, v)
		if err != nil || !value {
			global.GVA_LOG.Error("初始化添加系统定时任务", zap.Any("ERROR", err))
		}
	}
	//job方式
	timerStructMap["BulletinHandleTimer"] = handles.NewBulletinTimerHandle().Assignment
}

func NewTimerDispatch() *TimerDispatch {
	return &TimerDispatch{}
}

// AddFunTimer  进行动态加载相关的运行任务 添加函数方法的方式 无入参无返回值
func AddFunTimer(timer model.StockTImer, handle func(), option []cron.Option) error {
	option = append(option, cron.WithSeconds()) //精确到秒
	//taskName string, spec string, taskExecution string, option ...cron.Option
	id, err := global.GVA_Timer.AddTaskByFunc(timer.UniqueCode, timer.TimerSpec, timer.Execution, handle, option...)
	if err != nil || id == -1 {
		global.GVA_LOG.Error("FUNC 定时任务添加失败", zap.Any("StockTImer", timer), zap.Error(err))
	} else {
		global.GVA_LOG.Info("FUNC 定时任务添加成功", zap.Any("timer_id", id), zap.Any("StockTImer", timer))
	}
	return err
}

// AddTaskJob  JOB自定义定时任务方式，可带参数
func AddTaskJob(timer model.StockTImer, params map[string]interface{}, option ...cron.Option) error {
	option = append(option, cron.WithSeconds())
	//匹配定时任务添加任务方法实现的Handle
	v, ok := timerStructMap[timer.Execution]
	if ok {
		err := v(timer, params)
		if err != nil {
			return err
		}
	} else {
		global.GVA_LOG.Error("JOB 定时任务添加失败 未匹配到其添加方法", zap.Any("StockTImer", timer))
		return errors.New("JOB定时任务添加失败，未匹配到实现方法")
	}
	return nil
}
func (t *TimerDispatch) TestTimer() {
	global.GVA_LOG.Info("测试使用robfig/cron 执行定时任务>>>>>", zap.Any("currentTime", time.Now()))
}
